Nun wollen wir uns noch anschauen, wie die nächste Aufgabe aufgebaut ist.
In der nächsten Aufgabe sollt ihr die Sista implementieren.
Bei der Sista handelt es sich um einen einfachen HTTP Server, der das HTTP-Protokoll spricht,
um HTML Seiten auszuliefern.
Diese befinden sich in einem www-Pfad, aus dem nicht ausgebrochen werden darf.
Die Abarbeitung der HTTP-Anfragen erfolgt dabei jeweils in einem eigenen Prozess.
Das bedeutet, die Sista folgt sich für jede eingehende Verbindung.
Was ihr dabei lernen sollt, ist zum einen, wie man mit der Netzwerkkommunikation auf
Serverseite zurechtkommt und wie man modulare Software schreibt.
Die Sista besteht nämlich aus einzelnen Modulen, die unabhängig voneinander wiederverwendet
werden können.
Teile der Sista werden in einer späteren Aufgabe, der Mother, wiederverwendet bzw. ersetzt.
Da die Modularisierung in der Sista ein wesentlicher Teil ist, wollen wir uns nochmal genauer anschauen,
was ein Modul in C ist.
In C besteht ein Modul einmal aus der öffentlichen Schnittstelle.
Das ist die Header-Datei, die andere C-Module inkludieren können, um auf die Funktionen
des Moduls zuzugreifen.
Die konkrete Implementierung dieser Schnittstelle befindet sich in der C-Datei.
Hier muss man darauf achten, dass alles, was öffentlich verfügbar ist, als extern deklariert
ist, wobei dies im Fall von Funktionen immerzu der Fall ist, wenn nicht anders angegeben.
Gleichzeitig muss man darauf achten, dass alle Symbole, die in der C-Datei definiert
werden und nicht Teil der öffentlichen Schnittstelle sind, geheim bleiben.
Dies wird sichergestellt, indem man sie als static deklariert, z.B. statisch-globale
Variablen oder statische Funktionen.
Damit wird die Trennung der öffentlich sichtbaren Schnittstelle und der privaten Daten durchgesetzt.
Die weitere Trennung zwischen einer Header-Datei, in der die öffentliche Schnittstelle definiert
ist und der konkreten Implementierung, ermöglicht es, dass man die Implementierung austauschen
kann.
Und zwar ohne, dass man andere Module, die die öffentliche Schnittstelle nutzen, anpassen
müsste.
Das bedeutet aber auch, dass, wenn man eine konkrete Implementierung austauscht, man
alle Module, die zusammengehören, erneut linken muss, um ein ausführbares Programm
zu erhalten, das die neue Implementierung beinhaltet.
Die alten Module, die gegen die Schnittstelle gebaut sind, müssen aber nicht erneut kompiliert
werden.
Also schauen wir uns mal die einzelnen Module an, die ihr implementieren müsst.
Wir haben zum einen die Sista.c.
Hier ist die Main-Funktion.
Sie ist dafür verantwortlich, alle weitere Module zu initialisieren und die Interprozesskommunikation
in Form von Sockets aufzubauen.
Anschließend nimmt sie einzelne Verbindungen an und übergibt diese an das jeweils dafür
zuständige Modul.
Ein weiteres Modul ist das Verbindungsmodul in der Datei connection-fork.c.
Dieses Modul implementiert die Schnittstelle aus der Datei connection.h.
Hier wird zum einen das Anfrage-Modul initialisiert und für jede Verbindung, die es zugestellt
bekommt, wird ein eigener Kind-Prozess gestartet.
Dabei wird auch sichergestellt, dass jeder Kind-Prozess determiniert aufgeräumt wird.
Sobald ein Kind-Prozess erstellt wurde, der die jeweilige Anfrage bearbeiten kann, wird
die Anfrage weiter an das Anfrage-Modul gereicht.
Das Anfrage-Modul wird in der Datei request-http.c implementiert und richtet sich nach der Schnittstelle
Zugänglich über
Offener Zugang
Dauer
00:04:57 Min
Aufnahmedatum
2020-11-15
Hochgeladen am
2020-11-15 19:39:16
Sprache
de-DE